package com.dp.client.views.almacenes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.ListDataProvider;
import com.dp.client.dto.ConexionDTO;
import com.dp.client.dto.PaqueteDTO;
import com.dp.client.dto.PaqueteEnvio;
import com.dp.client.dto.RutasVueloEnvio;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.paquete.IServiciosPaquete;
import com.dp.client.servicios.paquete.IServiciosPaqueteAsync;
import com.dp.client.servicios.simulacion.IServiciosSimulacion;
import com.dp.client.servicios.simulacion.IServiciosSimulacionAsync;
import com.dp.client.util.Alerts;

public class TablaPaquetesAlmacen extends Composite {
	private AlmacenPaquetesPrincipal padre;
	private DataGrid<PaqueteDTO> dataGrid;
	SimplePager pager;
	ListDataProvider<PaqueteDTO> provider;

	public TablaPaquetesAlmacen(AlmacenPaquetesPrincipal almacenPaquetesPrincipal) {
		this.padre=almacenPaquetesPrincipal;
		dataGrid = new DataGrid<PaqueteDTO>();
		//initWidget(dataGrid);
		
		
		TextColumn<PaqueteDTO> columna_codigo= new TextColumn<PaqueteDTO>(){

			@Override	
			public String getValue(PaqueteDTO object) {
				return object.getCodigo();
			}
		};
		dataGrid.addColumn(columna_codigo,"Codigo");
		
		TextColumn<PaqueteDTO> columna_origen= new TextColumn<PaqueteDTO>(){

			@Override
			public String getValue(PaqueteDTO object) {
				return padre.getAlmacen(object.almacenOrigen).getDescripcion();
			}
		};
		dataGrid.addColumn(columna_origen,"Origen");
		
		TextColumn<PaqueteDTO> columna_destino= new TextColumn<PaqueteDTO>(){

			@Override
			public String getValue(PaqueteDTO object) {
				return padre.getAlmacen(object.almacenDestino).getDescripcion();
			}
		};
		dataGrid.addColumn(columna_destino,"Destino");
		
		ButtonCell boton = new ButtonCell();
		Column< PaqueteDTO, String> columna_modificar = new Column<PaqueteDTO, String>(boton) {
			@Override
			public String getValue(PaqueteDTO object) {
				String msg="Entrada";
				if (object.estadoPaquete==4)
					msg="Recogido";
				else if (object.reruteo || object.getPlanDeVuelo()==-1)
					msg="Rerutear";
				else if (object.almacenActual == object.almacenDestino && object.estadoPaquete==2)
					msg="Recoger";
				else if ( object.estadoPaquete == 2 )
					msg="Salida";
				return msg;
			}
		};
		dataGrid.addColumn( columna_modificar , "Movimiento" );
		columna_modificar.setFieldUpdater( new FieldUpdater<PaqueteDTO, String>() {
			@Override
			public void update(int index, PaqueteDTO object, String value) {
				actualizar(object);
			}
		});
		provider = new ListDataProvider<PaqueteDTO>();
		provider.addDataDisplay( dataGrid );
		pager = new SimplePager();
		pager.setWidth("100%");
		VerticalPanel vertical = new VerticalPanel();
		vertical.setSize("450px", "457px");
		initWidget(vertical);
		dataGrid.setSize("100%", "431px");
		vertical.add( pager );
		vertical.add(dataGrid );
		pager.setDisplay( dataGrid );
		pager.setPageSize( 10 );
	}

	protected void actualizar(PaqueteDTO paquete) {
		// TODO Auto-generated method stub
		/*System.out.println("actual "+object.almacenActual+" destino "+object.almacenDestino);
		*/
		if (paquete.reruteo || paquete.getPlanDeVuelo()==-1){
			reruteo(paquete);
			return;
		}
		else if(paquete.almacenActual == paquete.almacenDestino){
			verificarRecojo(paquete);
			return;
		}
		if (paquete.estadoPaquete==4){
			Alerts.crearAlerta("El paquete ya fue recogido");
			return;
		}
		IServiciosPaqueteAsync serviciosPaquete = GWT.create(IServiciosPaquete.class);
		serviciosPaquete.MovimientoPaqueteAlmacen(paquete, new AsyncCallback< Boolean > (){
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
			
			@Override
			public void onSuccess(Boolean result) {
					Alerts.dialogExitoModificacionDeObjeto("paquete");
					padre.refrescar();
			}
		});
	}

	protected void reruteo(PaqueteDTO object) {
		IServiciosSimulacionAsync serviciosSimulacion= GWT.create(IServiciosSimulacion.class);
		serviciosSimulacion.reasignarRuta(object,new AsyncCallback<Boolean>() {
			@Override
			public void onSuccess(Boolean result) {
				String msg="Se reasigno ruta";
				if (!result)
					msg="No hay ruta disponible, seguir intentando";
				else padre.refrescar();
				Alerts.crearAlerta(msg);
			}
			@Override
			public void onFailure(Throwable caught) {
				
				Alerts.dialogErrorConexion();
			}
		});
	}

	protected void verificarRecojo(PaqueteDTO object) {
		
		RecogerDialog recogerDialog= new RecogerDialog(object,this);
		recogerDialog.center();
		recogerDialog.addCloseHandler(new CloseHandler<PopupPanel>() {
			@Override
			public void onClose(CloseEvent<PopupPanel> event) {
				padre.refrescar();
			}
		});
	}
	public void refrescar(){
		padre.refrescar();
	}
	
	

	public void setData(List<PaqueteDTO> result) {
		//dataGrid.setRowData(result);
		provider.setList( result );
	}
	public void clearData(){
		List< PaqueteDTO > nuevo = new ArrayList< PaqueteDTO >();
		dataGrid.setRowData( nuevo );
	}
}
